package com.wen.yygh.msm.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import com.wen.yygh.msm.service.MsmService;
import com.wen.yygh.msm.utils.ConstantPropertiesUtils;
import com.wen.yygh.vo.msm.MsmVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;

/**
 * @author Wenjl
 */
@Service
@Slf4j
public class MsmServiceImpl implements MsmService {
    /**
     * 发送手机验证码
     *
     * @param phone 手机号
     * @param code  验证码
     * @return
     */
    @Override
    public boolean send(String phone, String code) {
        try {
            // 实例化一个认证对象，入参需要传入腾讯云账户secretId，secretKey,此处还需注意密钥对的保密
            // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取

            Credential cred = new Credential(ConstantPropertiesUtils.SECRET_ID, ConstantPropertiesUtils.SECRET_KEY);

            // 实例化要请求产品的client对象,clientProfile是可选的
            SmsClient client = new SmsClient(cred, ConstantPropertiesUtils.REGION);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            SendSmsRequest req = new SendSmsRequest();

            req.setPhoneNumberSet(new String[]{"+86" + phone});
            /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId，示例如1400006666 */
            req.setSmsSdkAppId(ConstantPropertiesUtils.SDK_ID);
            /* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名，签名信息可登录 [短信控制台] 查看 */
            String signName = "温嘉璐的编程语言记录分享";
            req.setSignName(ConstantPropertiesUtils.SIGN_NAME);
            /* 模板 ID: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看 */
            req.setTemplateId(ConstantPropertiesUtils.TEMPLATE_ID);

            /* 模板参数: 若无模板参数，则设置为空 */
            req.setTemplateParamSet(new String[]{code});
            // 返回的resp是一个SendSmsResponse的实例，与请求对象对应
            SendSmsResponse resp = client.SendSms(req);

            // 输出json格式的字符串回包
            log.info(SendSmsResponse.toJsonString(resp));
        } catch (TencentCloudSDKException e) {
            log.info(e.toString());
            return false;
        }
        return true;
    }

    @Override
    public boolean send(MsmVo msmVo) {
        if (!StringUtils.isEmpty(msmVo.getPhone())) {
            System.out.println("msmVo=>>"+msmVo);
            boolean send = this.send(msmVo.getPhone(), msmVo.getParam());
            return send;
        }
        return false;
    }

    private boolean send(String phone, Map<String,Object> map) {
        try {
            // 实例化一个认证对象，入参需要传入腾讯云账户secretId，secretKey,此处还需注意密钥对的保密
            // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取

            Credential cred = new Credential(ConstantPropertiesUtils.SECRET_ID, ConstantPropertiesUtils.SECRET_KEY);

            // 实例化要请求产品的client对象,clientProfile是可选的
            SmsClient client = new SmsClient(cred, ConstantPropertiesUtils.REGION);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            SendSmsRequest req = new SendSmsRequest();

            req.setPhoneNumberSet(new String[]{"+86" + phone});
            /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId，示例如1400006666 */
            req.setSmsSdkAppId(ConstantPropertiesUtils.SDK_ID);
            /* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名，签名信息可登录 [短信控制台] 查看 */
            String signName = "温嘉璐的编程语言记录分享";
            req.setSignName(ConstantPropertiesUtils.SIGN_NAME);
            /* 模板 ID: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看 */
            req.setTemplateId(ConstantPropertiesUtils.TEMPLATE_ID);

            /* 模板参数: 若无模板参数，则设置为空 */
            System.out.println("JSONObject.toJSONString(map)=>"+JSONObject.toJSONString(map));
            req.setTemplateParamSet(new String[]{"123"});
            // 返回的resp是一个SendSmsResponse的实例，与请求对象对应
            SendSmsResponse resp = client.SendSms(req);

            // 输出json格式的字符串回包
            log.info(SendSmsResponse.toJsonString(resp));
        } catch (TencentCloudSDKException e) {
            log.info(e.toString());
            return false;
        }
        return true;
    }
}
